import json
import logging
import os
import re
import sys

# 获取日志器
logger = logging.getLogger("tools")


def get_config_path(relative_path):
    """获取 config.json 的绝对路径（兼容开发和打包环境）"""
    # 1. 确定当前文件 tools.py 的绝对路径
    current_file = os.path.abspath(__file__)
    # 2. 开发环境下：根据目录结构计算相对路径
    #    从 tools.py 所在的 utils 文件夹，向上一级到项目根目录，再进入 config 文件夹
    dev_config_path = os.path.join(
        os.path.dirname(current_file), relative_path)
    # 标准化路径（处理 .. 等相对路径符号）
    dev_config_path = os.path.normpath(dev_config_path)
    # 3. 打包环境下：使用 PyInstaller 的临时目录（_MEIPASS）
    try:
        # 打包后，所有资源会被提取到 sys._MEIPASS 临时目录
        base_path = sys._MEIPASS
        if '../' in relative_path:
            deal_relative_path = os.path.relpath(relative_path, "..")
        else:
            deal_relative_path = os.path.normpath(relative_path)
        packed_config_path = os.path.join(base_path, deal_relative_path)
        return packed_config_path
    except AttributeError:
        # 非打包环境（开发时），返回开发环境的路径
        return dev_config_path


# 读取json文件
def read_json_file():
    config_path = r"../config/config.json"
    config_path = get_config_path(config_path)
    try:
        with open(config_path, 'r', encoding='utf-8') as file:
            data = json.load(file)
            return data
    except FileNotFoundError:
        logger.error("错误: 文件 '{}' 不存在".format(config_path))
    except json.JSONDecodeError:
        logger.error("错误: 文件 '{}' 不是有效的 JSON 格式".format(config_path))
    except Exception as e:
        logger.error("读取文件时发生错误: {}".format(str(e)))
    return None


# 查找本机ip
def get_local_ip():
    import socket
    try:
        ip = socket.gethostbyname(socket.gethostname())
        return ip
    except Exception as e:
        _ = e
        logger.warning("IP未查找到，请在命令行中自行查看，具体方法：1.win+r；2.cmd；3.ipconfig。")
        return "127.0.0.1"


def parse_jsonp_response(byte_data):
    """
    解析JSONP格式的字节流响应，支持多种编码格式

    参数:
        byte_data: 原始字节流数据
    返回:
        解析后的字典，如果解析失败则返回None
    """
    try:
        # 1. 尝试多种编码格式解码，解决中文乱码问题
        encodings = ['utf-8', 'gbk', 'gb2312', 'iso-8859-1']
        str_data = None

        for encoding in encodings:
            try:
                str_data = byte_data.strip().decode(encoding)
                break  # 找到正确的编码就退出循环
            except UnicodeDecodeError:
                continue

        if not str_data:
            logger.error("所有编码格式都无法解码数据")
            return None

        # 2. 使用正则提取JSON部分（去除外层的dr1004(...)）
        match = re.match(r'^dr\d+\((.*)\)$', str_data)
        if not match:
            logger.error("数据格式不符合JSONP规范")
            return None

        json_str = match.group(1)

        # 3. 解析JSON字符串为字典
        result = json.loads(json_str)

        # 4. 修复可能的乱码字段（如NID）
        if 'NID' in result and isinstance(result['NID'], str):
            # 尝试重新解码NID字段（常见于混合编码情况）
            for encoding in ['gbk', 'gb2312', 'utf-8']:
                try:
                    result['NID'] = result['NID'].encode('latin-1').decode(encoding)
                    break
                except Exception as e:
                    _ = e
                    continue

        return result

    except json.JSONDecodeError:
        logger.error("JSON格式解析错误")
    except Exception as e:
        logger.error(f"解析过程出错: {str(e)}")
    return None


def save_config(config_json):
    try:
        with open(get_config_path(), 'w', encoding='utf-8') as f:
            json.dump(config_json, f, ensure_ascii=False, indent=4)
        return True
    except Exception as e:
        logger.error("账户密码保存错误，{}".format(e))


if __name__ == '__main__':
    s = read_json_file()
    print(s.get('url'))
